package com.cy.pj.common.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 自定义cache切面
 */
@Aspect
@Component
public class CacheAspect {
    //找到关联Cache对象,后续基于此对象操作cache
    /**
     * 进行缓存的切入点
     */
    @Pointcut("@annotation(com.cy.pj.common.annotation.RequiredCache)")
    public void doCache(){}

    /**
     * 清缓存切入点
     */
    @Pointcut("@annotation(com.cy.pj.common.annotation.ClearCache)")
    public void doClearCache(){}

    //清cache
    @AfterReturning("doClearCache()")
     public void doAfterReturning(){//目标方法成功执行结束以后再执行这个方法
        System.out.println("Clear cache");
    }
    @Around("doCache()")
    public Object doAround(ProceedingJoinPoint joinPoint)throws Throwable{
        //1.从cache取数据,取到则直接返回(return)
        System.out.println("Get Data from cache");
        //2.cache中没有我们要取的数据则访问数据库(proceed)
        Object result=joinPoint.proceed();//最终执行目标方法
        //3.将数据存储到cache 下次取时从cacahe取
        System.out.println("Put data to cahce");
        return result;
    }


}
